home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / SoundAndMusic / cmix / lib / getsample.c < prev    next >
C/C++ Source or Header  |  1990-10-18  |  3KB  |  97 lines

  1. #include "../H/ugens.h"
  2. #include "../H/sfheader.h"
  3. #include <stdio.h>
  4. #include <math.h>
  5.  
  6. extern SFHEADER sfdesc[NFILES];
  7. extern int sfd[NFILES];
  8. extern int bufsize[NFILES];
  9. extern char *sndbuf[NFILES];
  10. int (*getsample)();
  11. int getfsample();
  12. int getisample();
  13.  
  14. getsetnote(start,dur,filenum)
  15. float start,dur;
  16. int filenum;
  17. {
  18.     int nsamples = setnote(start,dur,filenum);
  19.     _backup(filenum);
  20.     if(sfclass(&sfdesc[filenum]) == SF_FLOAT) getsample = getfsample;
  21.     else                                        getsample = getisample;
  22.     return(nsamples);
  23.  
  24. }
  25. getisample(sampleno,c,input)
  26. float *c;
  27. double sampleno;
  28. {
  29.  
  30.     int RECSIZE = bufsize[input];
  31.     int BPREC = RECSIZE * sizeof(short);
  32.     int BPFRAME = sfchans(&sfdesc[input]) * sizeof(short);
  33.     int FPREC = RECSIZE/sfchans(&sfdesc[input]);
  34.  
  35.     int sample,i,j;
  36.     short *array = (short *)sndbuf[input];
  37.     float fraction;
  38.     static int oldsample = 0;
  39.     static int endsample = 0;
  40.  
  41.     sample = (int)sampleno;
  42.     fraction = sampleno - (double)sample;
  43.     if(!((sample >= oldsample) && (sample < endsample))) {
  44.         if(sflseek(sfd[input], sample * BPFRAME, 0) <=0) {
  45.             fprintf(stderr,"badlseek on inputfile\n");
  46.             closesf();
  47.         }
  48.         if(read(sfd[input],(char *)array,BPREC) <= 0) {
  49.             fprintf(stderr,"reached eof on input file \n");
  50.             return(0);
  51.         }
  52.         oldsample = sample;
  53.         endsample = oldsample + FPREC - 1;
  54.         }
  55.     for(i=(sample-oldsample)*sfchans(&sfdesc[input]),j=0; 
  56.                     j<sfchans(&sfdesc[input]); i++,j++)  
  57.         *(c+j) = (float)*(array+i) + fraction * 
  58.             ((float) *(array+i+sfchans(&sfdesc[input])) - 
  59.                  (float) *(array+i));
  60.     return(1);
  61. }
  62. getfsample(sampleno,c,input)
  63. float *c;
  64. double sampleno;
  65. {
  66.     int RECSIZE = bufsize[input];
  67.     int BPREC = RECSIZE * sizeof(float);
  68.     int BPFRAME = sfchans(&sfdesc[input]) * sizeof(float);
  69.     int FPREC = RECSIZE/(float)sfchans(&sfdesc[input]);
  70.  
  71.     int sample,i,j;
  72.     float *array = (float *)sndbuf[input];
  73.     float fraction;
  74.     static int oldsample = 0;
  75.     static int endsample = 0;
  76.  
  77.     sample = (int)sampleno;
  78.     fraction = sampleno - (double)sample;
  79.     if(!((sample >= oldsample) && (sample < endsample))) {
  80.         if(sflseek(sfd[input], sample * BPFRAME, 0) <=0) {
  81.             fprintf(stderr,"badlseek on inputfile\n");
  82.             closesf();
  83.         }
  84.         if(read(sfd[input],(char *)array,BPREC) <= 0) {
  85.             fprintf(stderr,"reached eof on input file \n");
  86.             return(0);
  87.         }
  88.         oldsample = sample;
  89.         endsample = oldsample + FPREC - 1;
  90.         }
  91.     for(i = (sample-oldsample)*sfchans(&sfdesc[input]),j=0; 
  92.                     j<sfchans(&sfdesc[input]); i++,j++)  
  93.         *(c+j) = *(array+i) + fraction * 
  94.             (*(array+i+sfchans(&sfdesc[input])) - *(array+i));
  95.     return(1);
  96. }
  97.